package pe.edu.upc.dai.grupovictor.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import pe.edu.upc.dai.grupovictor.dao.ProgramaCursoDao;
import pe.edu.upc.dai.grupovictor.dao.util.ConnectionUtils;
import pe.edu.upc.dai.grupovictor.dao.util.DaoException;
import pe.edu.upc.dai.grupovictor.model.Ciclo;
import pe.edu.upc.dai.grupovictor.model.Curso;
import pe.edu.upc.dai.grupovictor.model.Profesor;
import pe.edu.upc.dai.grupovictor.model.ProgramaCurso;

public class ProgramaCursoDaoImpl implements ProgramaCursoDao {

    public ProgramaCurso seleccionarPorPrimaryKey(Long id) {
        Connection connection = null;
        PreparedStatement st = null;
        ResultSet rs = null;
        ProgramaCurso programaCurso = null;
        try {
            connection = ConnectionUtils.getConnection();
            st = connection.prepareStatement("" +
                    "SELECT T.ID_SECCION,T.CODIGO_SECCION, " +
                    "       P.ID_PROFESOR,P.CO_PROFESOR,P.NOMBRE_PROFESOR, " +
                    "       CI.ID_CICLO,CI.CODIGO_EXTERNO,CI.NOMBRE_CICLO, " +
                    "       CU.ID_CURSO,CU.CODIGO_CURSO,CU.NOMBRE_CURSO " +
                    "FROM PROGRAMA_CURSO T " +
                    "JOIN PROFESOR P ON T.ID_PROFESOR = P.ID_PROFESOR " +
                    "JOIN CURSO CU ON T.ID_CURSO = CU.ID_CURSO " +
                    "JOIN CICLO CI ON T.ID_CICLO = CI.ID_CICLO " +
                    "WHERE T.ID_SECCION = ? ");
            st.setLong(1, id);
            rs = st.executeQuery();
            if (rs.next()) {
                Profesor profesor = new Profesor();
                profesor.setIdProfesor(rs.getLong("ID_PROFESOR"));
                profesor.setCoProfesor(rs.getString("CO_PROFESOR"));
                profesor.setNombreProfesor(rs.getString("NOMBRE_PROFESOR"));

                Ciclo ciclo = new Ciclo();
                ciclo.setCodigoExterno(rs.getString("CODIGO_EXTERNO"));
                ciclo.setIdCiclo(rs.getLong("ID_CICLO"));
                ciclo.setNombreCiclo(rs.getString("NOMBRE_CICLO"));

                Curso curso = new Curso();
                curso.setCodigoCurso(rs.getString("CODIGO_CURSO"));
                curso.setIdCurso(rs.getLong("ID_CURSO"));
                curso.setNombreCurso(rs.getString("NOMBRE_CURSO"));

                programaCurso = new ProgramaCurso();
                programaCurso.setCodigoSeccion(rs.getString("CODIGO_SECCION"));
                programaCurso.setIdSeccion(rs.getLong("ID_SECCION"));
                programaCurso.setIdCiclo(ciclo);
                programaCurso.setIdCurso(curso);
                programaCurso.setIdProfesor(profesor);

            }
        } catch (SQLException e) {
            throw new DaoException(e);
        } finally {
            ConnectionUtils.closeResultSet(rs);
            ConnectionUtils.closeStatement(st);
            ConnectionUtils.closeConnection(connection);
        }
        return programaCurso;
    }

    

    public void insertar(ProgramaCurso programaCurso) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void actualizar(ProgramaCurso programaCurso) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void eliminar(ProgramaCurso programaCurso) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public List<ProgramaCurso> seleccionarTodosByProfeCiclo(Profesor profe, Ciclo ciclo) {
        Connection connection = null;
        PreparedStatement st = null;
        ResultSet rs = null;
        ProgramaCurso programaCurso = null;
        List<ProgramaCurso> lista = new ArrayList<ProgramaCurso>();
        try {
            connection = ConnectionUtils.getConnection();
            st = connection.prepareStatement("" +
                    "SELECT T.ID_SECCION,T.CODIGO_SECCION, " +
                    "       P.ID_PROFESOR,P.CO_PROFESOR,P.NOMBRE_PROFESOR, " +
                    "       CI.ID_CICLO,CI.CODIGO_EXTERNO,CI.NOMBRE_CICLO, " +
                    "       CU.ID_CURSO,CU.CODIGO_CURSO,CU.NOMBRE_CURSO " +
                    "FROM PROGRAMA_CURSO T " +
                    "JOIN PROFESOR P ON T.ID_PROFESOR = P.ID_PROFESOR " +
                    "JOIN CURSO CU ON T.ID_CURSO = CU.ID_CURSO " +
                    "JOIN CICLO CI ON T.ID_CICLO = CI.ID_CICLO " +
                    "WHERE T.ID_PROFESOR = ? " +
                    "AND T.ID_CICLO = ? ");
            
            st.setLong(1, profe.getIdProfesor());
            st.setLong(2, ciclo.getIdCiclo());
            
            rs = st.executeQuery();
            while (rs.next()) {
                programaCurso = mapResultSet(rs);
                lista.add(programaCurso);
            }
        } catch (SQLException e) {
            throw new DaoException(e);
        } finally {
            ConnectionUtils.closeResultSet(rs);
            ConnectionUtils.closeStatement(st);
            ConnectionUtils.closeConnection(connection);
        }
        return lista;
    }

    private ProgramaCurso mapResultSet(ResultSet rs) throws SQLException {
        Profesor profesor = new Profesor();
        profesor.setIdProfesor(rs.getLong("ID_PROFESOR"));
        profesor.setCoProfesor(rs.getString("CO_PROFESOR"));
        profesor.setNombreProfesor(rs.getString("NOMBRE_PROFESOR"));

        Ciclo ciclo = new Ciclo();
        ciclo.setCodigoExterno(rs.getString("CODIGO_EXTERNO"));
        ciclo.setIdCiclo(rs.getLong("ID_CICLO"));
        ciclo.setNombreCiclo(rs.getString("NOMBRE_CICLO"));

        Curso curso = new Curso();
        curso.setCodigoCurso(rs.getString("CODIGO_CURSO"));
        curso.setIdCurso(rs.getLong("ID_CURSO"));
        curso.setNombreCurso(rs.getString("NOMBRE_CURSO"));

        ProgramaCurso programaCurso = new ProgramaCurso();
        programaCurso.setCodigoSeccion(rs.getString("CODIGO_SECCION"));
        programaCurso.setIdSeccion(rs.getLong("ID_SECCION"));

        programaCurso.setIdCiclo(ciclo);
        programaCurso.setIdCurso(curso);
        programaCurso.setIdProfesor(profesor);

        return programaCurso;
    }
}
